<?php
Class ModelCSV 
{
    /**
    * Свойства для инициализации объектов и ресурсов
    *
    * @var $msg Object             Объект очереди сообщений
    * @var $folder string        Имя папки с файлами CSV
    * @var $posts resource        Файл сообщений .CSV
    * @var $comments resource    Файл комментариев .CSV
    * @var $fposts array        Массив строк файла сообщений
    * @var $fcomments array        Массив строк файла комментариев
    * @var $aposts array        Массив строк
    * @var $acomments array        Массив комментариев
    */
    public $msg;
    private $folder;
    private $posts;
    private $comments;
    private $fposts;
    private $fcomments;
    private $aposts;
    private $acomments;

    /**
    * Конструктор
    *
    * Получает ссылку на объект очереди сообщений и проверяет доступность файлов
    *
    * @param &$msg Object     Ссылка на объект очереди сообщений
    * @param &$config Array Ссылка на массив параметров
    */
    function __construct(&$msg, &$config) 
    {
        $this->msg = &$msg;
        $this->folder = &$config['folder'];
        // Проверка на существование папки и файлов
        if (!file_exists($this->folder)) {
			mkdir($this->folder);
		}
        if (!file_exists($this->folder.DIRECTORY_SEPARATOR."posts.csv")) 
        {
            $this->posts = fopen($this->folder.DIRECTORY_SEPARATOR."posts.csv", "w");
            fclose($this->posts);
        }
        if (!file_exists($this->folder.DIRECTORY_SEPARATOR."comments.csv"))
        {
            $this->comments = fopen($this->folder.DIRECTORY_SEPARATOR."comments.csv", "w");
            fclose($this->comments);
        }
    }
    /**
    * Валидатор
    *
    * Метод делает входные данные валидными
    *
    */
    private function validator() 
    {
        $autor = mysql_escape_string($_POST['autor']);
        $text = mysql_escape_string($_POST['text']);
        $_POST['id'] = intval($_POST['id']);
        $_POST['autor'] = $autor;
        $_POST['text'] = $text;
    }
    /**
    * Добавление в файл
    *
    * Метод добавляет в файл сообщение или комментарий в зависимости от id
    *
    * @param &$id integer    Идентификатор сообщения для добавления комментария
    * @param &$autor string    Имя автора
    * @param &$text string    Текст сообщения или комментария
    */
    public function add(&$id, &$autor, &$text) 
    {
        $this->validator();
        if ($id) 
        {
            $this->comments  = fopen($this->folder.DIRECTORY_SEPARATOR."comments.csv", "a+");
            $this->fcomments = file($this->folder.DIRECTORY_SEPARATOR."comments.csv");
            $this->acomments = array_map('str_getcsv', $this->fcomments);
            $last = end($this->acomments);
            fputcsv($this->comments, array($last[0]+1,$id,$autor,date('U'),$text));
            fclose($this->comments);
        } else 
        {
            $this->posts  = fopen($this->folder.DIRECTORY_SEPARATOR."posts.csv", "a+");
            $this->fposts = file($this->folder.DIRECTORY_SEPARATOR."posts.csv");
            $this->aposts = array_map('str_getcsv', $this->fposts);
            $last = end($this->aposts);
            fputcsv($this->posts, array($last[0]+1,$autor,date('U'),$text));
            fclose($this->posts);
        }
    }
    /**
    * Изменение сообщения
    *
    * Метод изменяет целевое сообщение в файле
    *
    * @param &$id integer    Идентификатор сообщения
    * @param &$text string    Текст сообщения
    */
    public function changepost(&$id, &$text) 
    {
        $this->validator();
        $this->fposts = file($this->folder.DIRECTORY_SEPARATOR."posts.csv");
        $this->aposts = array_map('str_getcsv', $this->fposts);
        $this->posts  = fopen($this->folder.DIRECTORY_SEPARATOR."posts.csv", "w");
        foreach ($this->aposts as $key => $line) 
        {
            if ($line[0] == $id) 
            { 
                $line[3] = $text; 
            }
            fputcsv($this->posts, $line);
        }
        fclose($this->posts);
    }
    /**
    * Изменение комментария
    *
    * Метод изменяет целевой комментарий в файле
    *
    * @param &$id integer    Идентификатор комментария
    * @param &$text string    Текст комментария
    */
    public function changecomment(&$id, &$text) 
    {
        $this->validator();
        $this->fcomments = file($this->folder.DIRECTORY_SEPARATOR."comments.csv");
        $this->acomments = array_map('str_getcsv', $this->fcomments);
        $this->comments  = fopen($this->folder.DIRECTORY_SEPARATOR."comments.csv", "w");
        foreach ($this->acomments as $key => $line) 
        {
            if ($line[0] == $id) 
            { 
                $line[4] = $text; 
            }
            fputcsv($this->comments, $line);
        }
        fclose($this->comments);
    }
    /**
    * Удаление сообщения
    *
    * Метод удаляет целевое сообщение и его комментарии из файла
    *
    * @param &$id integer    Идентификатор сообщения
    */
    public function deletepost(&$id) 
    {
        $this->validator();
        $this->fposts = file($this->folder.DIRECTORY_SEPARATOR."posts.csv");
        $this->fcomments = file($this->folder.DIRECTORY_SEPARATOR."comments.csv");
        $this->aposts = array_map('str_getcsv', $this->fposts);
        $this->posts  = fopen($this->folder.DIRECTORY_SEPARATOR."posts.csv", "w");
        $this->acomments = array_map('str_getcsv', $this->fcomments);
        $this->comments  = fopen($this->folder.DIRECTORY_SEPARATOR."comments.csv", "w");
        foreach ($this->aposts as $key => $line) 
        {
            if ($line[0] != $id) 
            { 
                fputcsv($this->posts, $line);
            }
        }
        foreach ($this->acomments as $key => $line) 
        {
            if ($line[1] != $id) 
            { 
                fputcsv($this->comments, $line);
            }
        }
        fclose($this->posts);
        fclose($this->comments);
    }
    /**
    * Удаление комментария
    *
    * Метод удаляет целевой комментарий из файла
    *
    * @param &$id integer    Идентификатор комментария
    */
    public function deletecomment(&$id) 
    {
        $this->validator();
        $this->fcomments = file($this->folder.DIRECTORY_SEPARATOR."comments.csv");
        $this->acomments = array_map('str_getcsv', $this->fcomments);
        $this->comments  = fopen($this->folder.DIRECTORY_SEPARATOR."comments.csv", "w");
        foreach ($this->acomments as $key => $line) 
        {
            if ($line[0] != $id) 
            { 
                fputcsv($this->comments, $line);
            }
        }
        fclose($this->comments);
    }
    /**
    * Получение сообщений и комментариев
    *
    * Метод получает все сообщения с комментариями из CSV файлов
    *
    * @return Array         Возвращает все сообщения и комментарии
    */
    public function getall() 
    {
        $result = array();
        $flag = false;
        $this->fposts = file($this->folder.DIRECTORY_SEPARATOR."posts.csv");
        $this->fcomments = file($this->folder.DIRECTORY_SEPARATOR."comments.csv");
        $this->aposts = array_map('str_getcsv', $this->fposts);
        $this->acomments = array_map('str_getcsv', $this->fcomments);
        foreach ($this->aposts as $pline) 
        {
            $flag = false;
            foreach ($this->acomments as $cline) 
            {
                if ($pline[0] == $cline[1]) 
                {
                    $flag = true;
                    array_push($result, array($pline[0],$pline[1],gmdate("Y-m-d\ H:i:s\ ", $pline[2]),stripcslashes($pline[3]),$cline[0],$cline[2],gmdate("Y-m-d\ H:i:s\ ", $cline[3]),stripcslashes($cline[4])));
                }
            }
            if(!$flag)
                array_push($result, array($pline[0],$pline[1],gmdate("Y-m-d\ H:i:s\ ", $pline[2]),stripcslashes($pline[3]),NULL,NULL,NULL,NULL));
        }        
        return $result;
    }
}